﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace HelpSystem
{
    public static class Documentation
    {
        public enum ErrorCode
        {
            /// <summary>
            /// Невозможно соединиться с сервером БД. Проверьте найстройки подключения.
            /// </summary>
            UnableConnectToServer = 1, 
            /// <summary>
            /// EC0002: Доступ запрещён. Проверьте правильность ввода имени пользователя и пароля.
            /// </summary>
            AccessDenied = 2,
            /// <summary>
            /// EC0003: Задан несуществующий тип транспортного средства.
            /// </summary>
            IncorrectValue_TransportTypeID = 3,
            /// <summary>
            /// 
            /// </summary>
            IncorrentConnectionSettingsFile = 4
        }

        /// <summary>
        /// Главная форма приложения.
        /// Если == null, отображение кнопки "Справка" не произойдёт.
        /// </summary>
        public static Form MainForm = null;
        /// <summary>
        /// XML документ с описанием ошибок и указанием разделов справки
        /// </summary>
        private static XmlDocument XmlErrors = null;
       
        /// <summary>
        /// Загрузить коды ошибок из XML файла
        /// </summary>
        /// <param name="XmlFile"></param>
        public static void LoadErrorCodes(string XmlFile)
        {
            if (XmlErrors == null)
                XmlErrors = new XmlDocument();
            XmlErrors.Load(XmlFile);
        }

        /// <summary>
        /// Отобразить документированную ошибку по её коду
        /// </summary>
        /// <param name="Error">Код ошибки</param>
        public static void ShowError(ErrorCode Error)
        {
            if (XmlErrors == null)
            {
                MessageBox.Show("Незагружен файл с описанием кодов ошибок", 
                                "Ошибка",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }
            int ErrorCode = (int)Error;
            string KeywordError = "EC" + ErrorCode.ToString("D4");
            if (MainForm != null)
            {
                //Определяем имя файла справки
                string ErrorFile = "help.chm";
                if (XmlErrors.SelectSingleNode("//errors/ru").Attributes["file"] != null)
                    ErrorFile = XmlErrors.SelectSingleNode("//errors/ru").Attributes["file"].InnerText;
                //Определяем отображаемый заголовок
                string MessageCaption = "Ошибка";
                if (XmlErrors.SelectSingleNode("//errors/ru").Attributes["caption"] != null)
                    MessageCaption = XmlErrors.SelectSingleNode("//errors/ru").Attributes["caption"].InnerText;
                //Ищём узел с описанием ошибки
                XmlNode ErrorNode = XmlErrors.SelectSingleNode("//errors/ru/"+KeywordError);
                if (ErrorNode != null)
                {
                    MessageBox.Show(MainForm,
                                    KeywordError+": "+ErrorNode.InnerText,
                                    MessageCaption,
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error,
                                    MessageBoxDefaultButton.Button1,
                                    0, ErrorFile, HelpNavigator.KeywordIndex, KeywordError);                    
                }
                else
                {
                    MessageBox.Show(KeywordError+": Ошибка не описана. Обновите программу или обратитесь к разработчику.",
                                    "Ошибка",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show(KeywordError + ": Ошибка не описана. Обновите программу или обратитесь к разработчику.",
                                "Ошибка",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Отобразить недокументированную ошибку
        /// </summary>
        /// <param name="Message">Сообщение ошибки</param>
        public static void ShowError(string Message)
        {
            MessageBox.Show(Message,
                            "Ошибка",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
        }
    }
}
